新サービス「AWS Device Farm」を使って Android アプリをテストしてみた!
AWS Device Farm
本日、AWS の新サービス「AWS Device Farm」(以下 Device Farm) がリリースされました。Device Farm はモバイルアプリのテストをクラウドで行うサービスです。現時点では Android と Fire OS が対応しており、既存のテストケースを実施したり、モンキーテストを実施したりすることができます。Android または Fire OS 上で動くアプリであればテストできるので、PhoneGap や Titanium、Xamarin、Unity といったフレームワークを使ったアプリもテスト可能です。
ということで、早速触ってみました!
使用できるテスティングフレームワーク
以下のテスティングフレームワークを使ってテストを実行できます。
- Built-in: Fuzz
- Appium Java JUnit
- Appium Java TestNG
- Calabash
- Instrumentation
- uiautomator
テスト対象の Android アプリの作成
まずはテスト対象の Android アプリを用意しましょう。今回は Android Studio で作った、単純な Android アプリプロジェクトを使います。なお、Device Farm ではテストケースを記述しなくてもテストが可能なので、今回は特に用意していません。
プロジェクトの作成
それでは Device Farm を使ってみましょう。Device Farm は現在、オレゴンリージョンのみで使用可能です。まずは「Getting Started」をクリック。
Project name に適当な名前を付けます。
5つのステップを順番に進めていきます。まずは Android アプリの APK をアップロードします。Android Studio でビルドしたことがあると app/build/app-debug.apk
が生成されていると思うので、これをアップロードします。
OKです。「Next step」へ。
テストの設定が表示されます。今回は Built-in: Fuzz を使います。これは Device Farm がデフォルトで用意してくれているつまりテストケースを用意していなくてもテストできます。ランダムにアプリを動かしてくれます。モンキーテストですね。
以下の項目を設定します。
設定値 | 説明 |
---|---|
Event count | 実行するイベント数 |
Event throttle | 1イベントの待機時間(ミリ秒) |
Randomizer seed | イベントのシーケンス番号(以前と同じイベントを実施する場合に使用) |
次はテストを動かすデバイスです。Galaxy が豊富ですね。
次は、デバイス上の細かい設定です。データを突っ込んだり、他のアプリをインストールしたりできます。また、Wi-Fi や Bluetooth、GPS や NFC といった各機能の有効・無効が設定できます。設定が終わったら「Review and start run」をクリックします。
設定をもろもろ最終確認します。問題がなければ「Confirm and start run」をクリックします。
これでテストが実施されます。表示されているのは Run resuls 画面というもので、ここで実施したテストの進捗や結果が確認できます。
先ほど実施したテストを見てみましょう。おぉ…なんかごにょごにょやってますね…
終わりました!オールグリーンで気持ちが良いですね。
テスト結果の確認
それでは、テスト結果を確認してみましょう。今回は5つのデバイスで動かしてみました。Samsung Galaxy S5 (AT&T) を選びます。
まず表示されるのが Details タブです。こちらでは、Device Farm がテストを実施したログが見れます。
Screen shot タブでは、撮影したスクリーンショットがダウンロードできます。今回は特に書き出されませんでした。
Performance タブでは、CPU 使用率、メモリ使用量、スレッド数がグラフで確認できます。
Files タブでは、Logcat のログファイルやモンキーテストのログファイルがダウンロードできます。ログを出力していた場合に、こちらで確認できますね。
モンキーテストのログはこんな感じでした。一部抜粋。
:Monkey: seed=1437948621446 count=6000 :AllowPackage: sample.classmethod.jp.devicefarm :IncludeCategory: android.intent.category.LAUNCHER :IncludeCategory: android.intent.category.MONKEY // Selecting main activities from category android.intent.category.LAUNCHER // + Using main activity sample.classmethod.jp.devicefarm.MainActivity (from package sample.classmethod.jp.devicefarm) // Selecting main activities from category android.intent.category.MONKEY // Seeded: 1437948621446 // Event percentages: // 0: 15.0% // 1: 10.0% // 2: 2.0% // 3: 15.0% // 4: -0.0% // 5: 25.0% // 6: 15.0% // 7: 2.0% // 8: 2.0% // 9: 1.0% // 10: 13.0% :Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=sample.classmethod.jp.devicefarm/.MainActivity;end // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=sample.classmethod.jp.devicefarm/.MainActivity } in package sample.classmethod.jp.devicefarm Sleeping for 50 milliseconds :Sending Touch (ACTION_DOWN): 0:(933.0,1227.0) :Sending Touch (ACTION_UP): 0:(924.40643,1214.2377) Sleeping for 50 milliseconds :Sending Key (ACTION_DOWN): 20 // KEYCODE_DPAD_DOWN :Sending Key (ACTION_UP): 20 // KEYCODE_DPAD_DOWN Sleeping for 50 milliseconds :Sending Key (ACTION_DOWN): 82 // KEYCODE_MEN U :Sending Key (ACTION_UP): 82 // KEYCODE_MENU Sleeping for 50 milliseconds :Sending Key (ACTION_DOWN): 21 // KEYCODE_DPAD_LEFT :Sending Key (ACTION_UP): 21 // KEYCODE_DPAD_LEFT Sleeping for 50 milliseconds :Sending Key (ACTION_DOWN): 19 // KEYCODE_DPAD_UP :Sending Key (ACTION_UP): 19 // KEYCODE_DPAD_UP Sleeping for 50 milliseconds :Sending Touch (ACTION_DOWN): 0:(28.0,1919.0) :Sending Touch (ACTION_UP): 0:(23.40619,1916.9669) Sleeping for 50 milliseconds :Sending Touch (ACTION_DOWN): 0:(856.0,764.0) :Sending Touch (ACTION_UP): 0:(859.559,755.3599) Sleeping for 50 milliseconds :Sending Key (ACTION_DOWN): 22 // KEYCODE_DPAD_RIGHT :Sending Key (ACTION_UP): 22 // KEYCODE_DPAD_RIGHT Sleeping for 50 milliseconds :Sending Key (ACTION_DOWN): 20 // KEYCODE_DPAD_DOWN :Sending Key (ACTION_UP): 20 // KEYCODE_DPAD_DOWN Sleeping for 50 milliseconds :Sending Key (ACTION_DOWN): 23 // KEYCODE_DPAD_CENTER :Sending Key (ACTION_UP): 23 // KEYCODE_DPAD_CENTER Sleeping for 50 milliseconds :Sending Trackball (ACTION_MOVE): 0:(2.0,4.0) :Sending Trackball (ACTION_MOVE): 0:(-2.0,-4.0) :Sending Trackball (ACTION_MOVE): 0:(0.0,3.0) :Sending Trackball (ACTION_MOVE): 0:(3.0,-5.0) :Sending Trackball (ACTION_MOVE): 0:(-4.0,-4.0) :Sending Trackball (ACTION_MOVE): 0:(-1.0,3.0) :Sending Trackball (ACTION_MOVE): 0:(0.0,-1.0) :Sending Trackball (ACTION_MOVE): 0:(-3.0,0.0) :Sending Trackball (ACTION_MOVE): 0:(-4.0,-1.0) :Sending Trackball (ACTION_MOVE): 0:(-5.0,-4.0)
まとめ
すごく簡単に複数端末のテストが実施できました!モンキーテストが標準で使えるので、どんなアプリでもテストできそうなところが導入しやすいなぁと感じました。今回はモンキーテストしか行っていませんが、JUnit を使ったテストなども行えます。
Jenkins や CI サービスでテストすると、エミュレータがうまく動かなかったり、動いているのに ADB が認識しなかったりといった障害がありましたが、Device Farm がこれを解決してくれることを期待しています。
iOS 対応を待ち望んでいます!